package xs.szw.service.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @program: xs_oa
 * @description:  日志切面
 * @author: Songzw
 * @create: 2025-02-11 20:40
 **/
@Aspect // 声明这是一个切面类
@Component
@Slf4j
public class LogAspect {

    @Pointcut("execution(* xs.szw.service.controller..*(..))")
    public void logPointcut() {
    }

    // 环绕通知：在方法执行前后记录日志
    @Around("logPointcut()")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis(); // 记录开始时间

        try {
            // 打印方法进入日志
            log.info("进入方法: {}.{} 参数： {}",
                    joinPoint.getTarget().getClass().getSimpleName(),
                    joinPoint.getSignature().getName(),
                    Arrays.toString(joinPoint.getArgs()));

            // 执行目标方法
            return joinPoint.proceed();
        } finally {
            // 记录方法执行结束的日志
            long elapsedTime = System.currentTimeMillis() - startTime;
            log.info("退出方法: {}.{} 花费 {} ms",
                    joinPoint.getTarget().getClass().getSimpleName(),
                    joinPoint.getSignature().getName(),
                    elapsedTime);
        }
    }
}
